// 插件：每分钟生成一个 32 位随机 key，存入 Redis（按日期目录），过期 1 天，并更新数据库字段
declare function defineNitroPlugin<T = any>(fn: (ctx: any) => T): T

import crypto from 'crypto'
import redis from '../util/redis'
import { query } from '../util/mysql'


export default defineNitroPlugin(() => {
  console.log('[key-scheduler] plugin initialized')
  let running = false

  async function runOnce() {
    if (running) return
    running = true
    try {
      // 生成 32 字节 hex（32 个字符）
      const key = crypto.randomBytes(16).toString('hex')

      // 将 key 存入按日期分组的列表，例如 random_keys:20251126
      const container = `random_keys`

      try {
        // 优先使用列表存放并为该列表设置过期
        if (typeof (redis as any).lpush === 'function') {
          await (redis as any).lpush(container, key)
          // 每次写入时刷新过期时间为 86400 秒（1 天）
          if (typeof (redis as any).expire === 'function') {
            await (redis as any).expire(container, 24 * 60 * 60)
          }
        } else if (typeof (redis as any).set === 'function') {
          // 如果没有 list 支持，作为降级：为每个 key 单独写入并设置过期
          await (redis as any).set(`random_key:${key}`, '1', 'EX', 24 * 60 * 60)
        } else {
          console.warn('[key-scheduler] Redis client does not support write operations; skipping Redis storage')
        }
      } catch (redisErr) {
        console.error('[key-scheduler] redis write error', String(redisErr))
      }

      // 执行 SQL 更新：UPDATE lin_product SET product_info = ? WHERE product_name = '八八智能KEY'
      try {
        await query(`UPDATE lin_product SET product_info = ? WHERE product_name = ?`, [key, '八八智能KEY'])
        console.log('[key-scheduler] updated DB with new key')
      } catch (sqlErr) {
        console.error('[key-scheduler] db update error', String(sqlErr))
      }
    } catch (e) {
      console.error('[key-scheduler] top-level error', String(e))
    } finally {
      running = false
    }
  }

  // 启动时立即运行一次，随后每 60 秒运行
  setTimeout(() => void runOnce(), 1000)
  setInterval(() => void runOnce(), 60 * 1000)
})
